home *** CD-ROM | disk | FTP | other *** search
/ HyperLib 1997 Winter - Disc 1 / HYPERLIB-1997-Winter-CD1.ISO.7z / HYPERLIB-1997-Winter-CD1.ISO / オンラインウェア / UTIL / NoBalloonMenu 1.0.1 w+src.sit / NoBalloonMenu 1.0.1 w_src / NoBalloonMenu Source / NoBalloonMenu 1.01.c next >
C/C++ Source or Header  |  1994-08-20  |  2KB  |  78 lines

  1. /*
  2.  * Think C 5.04 source for NoBalloonMenu 1.0.1
  3.  *
  4.  * Copyright ゥ 1994 by Malcolm Davidson, Sydney, Australia.
  5.  * Email: mrd@mpe67.dmpe.csiro.au
  6.  */ 
  7.  
  8. /* #include <MacHeaders> */
  9. #include <SetUpA4.h>
  10.  
  11. #define GetResourceNum    0xA9A0        /* Trap number for GetResource */
  12. #define    kHMHelpMenuID    -16490        /* Help Menu ID */
  13.  
  14.  
  15. long            OldGetResource;        /* pointer to real GetResource */
  16.  
  17. pascal void NewGetResource(void);
  18. void main(void);
  19.  
  20.  
  21. /*************************************************************************/
  22. /* 
  23.  * Patch GetResource to remove the Balloon Help Menu before doing its stuff.
  24.  * Note that this patch preserve all registers apart from A0 and D0 
  25.  * (See IM1, p113)
  26.  */
  27.  
  28. pascal void NewGetResource(void)
  29. {
  30.     asm {                    /* Ensure A1 is preserved when setting up A4 */
  31.         move.l    A1,A0                    ; save A1
  32.         jsr        __GetA4                    ; 
  33.         move.l    A4,-(sp)                ; save old A4
  34.         move.l    (A1),A4                    ; get new A4
  35.         move.l    A0,A1                    ; restore old A1
  36.         movem.l    D1-D7/A1-A6,-(sp)        ; save non-trashable registers
  37.     }
  38.  
  39.  
  40. /* 
  41.  * Remove Balloon Help from the MenuList. 
  42.  * If Help MenuID is not found then DeleteMenu does nothing.
  43.  */    
  44.     if(MenuList) DeleteMenu(kHMHelpMenuID); 
  45.     
  46.     asm {
  47.         movem.l (sp)+,D1-D7/A1-A6        ; restore saved registers
  48.         move.l    OldGetResource,A0        ; prepare to jmp
  49.         move.l    (sp)+,A4                ; restore A4
  50.         jmp        (A0)                    ; jump to real GetResource 
  51.     }
  52. }
  53.  
  54. /*************************************************************************/
  55. void main()
  56. {
  57.     Handle ourH;                    /*handle to our code resource*/
  58.     
  59.     RememberA0();                    /*to access resource globals*/
  60.     SetUpA4();
  61.     
  62.     asm {
  63.         _RecoverHandle                ; A0 points to our code
  64.         move.l    A0,ourH                ; get handle to us
  65.     }
  66.     
  67.     DetachResource(ourH);    /* ensure our code remains after install */
  68.     HLock(ourH);            /* Lock us down */
  69.     
  70. /* Create Patch */
  71.  
  72.     OldGetResource = NGetTrapAddress(GetResourceNum,ToolTrap);
  73.     NSetTrapAddress((long)NewGetResource,GetResourceNum,ToolTrap);
  74.     
  75.     RestoreA4();
  76. }
  77.  
  78.